#include <iostream>
#include <string>
#include<cstring>
#define LL long long

const int MAX = 1 << 17 + 10;

using namespace std;

int tree[MAX]; // 线段树
int lz[MAX];   // 延迟标记
int n, m;
int l, r, x;

void init()
{
    memset(tree, 0, sizeof(tree));
    memset(lz, 0, sizeof(lz));
}

// 创建线段树
void build(int node, int l, int r)
{
    if (l == r)
    {
        cin >> tree[node];
        return;
    }
    int mid = (l + r) / 2;
    build(node * 2, l, mid);
    build(node * 2 + 1, mid + 1, r);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

void push_down(int node, int l, int r)
{
    if (lz[node])
    {
        int mid = (l + r) / 2;
        lz[node * 2] += lz[node];
        lz[node * 2 + 1] += lz[node];
        tree[node * 2] += 1LL * (mid - l + 1) * lz[node];
        tree[node * 2 + 1] += 1LL * (r - mid) * lz[node];
        lz[node] = 0;
    }
}

LL query_range(int node,int L,int R,int l,int r){
	if(l <= L && r >= R) return tree[node];
	push_down(node,L,R);
	int mid = (L+R) / 2;
	LL sum = 0;
	if(mid >= l) sum += query_range(node*2,L,mid,l,r);
	if(mid < r) sum += query_range(node*2 + 1,mid+1,R,l,r);
	return sum;
}

// 区间更新
void update_range(int node, int l, int r, int L, int R, int add)
{
    if (l <= L && r >= R)
    {
        lz[node] += 1LL * add;
        tree[node] += 1LL * (R - L + 1) * add; // 更新方式
        return;
    }
    push_down(node, L, R);
    int mid = (L + R) / 2;
    if (mid >= l)
        update_range(node * 2, l, r, L, mid, add);
    if (mid < r)
        update_range(node * 2 + 1, l, r, mid + 1, R, add);
    tree[node] = tree[node * 2] + tree[node * 2 + 1];
}

int main()
{
    init();
    cin >> n >> m;
    build(1, 1, n);
    for (int i = 1; i <= m; i++)
    {
        cin >> l >> r >> x;
        update_range(l, l, r, 1, n, x);
    }
    for (int i = 1; i <= m; i++)
    {
        cout<<query_range(i,1,n,1,n)<<endl;
    }
    system("pause");
    return 0;
}
// 区间查找
